module fifo_wr(
//mudule clock
input wr_clk , // 时钟信号
input rst_n , // 复位信号
//FIFO interface
input wr_rst_busy , // 写复位忙信号
input empty , // FIFO 空信号
input almost_full , // FIFO 将满信号
output reg fifo_wr_en , // FIFO 写使能
output reg [7:0] fifo_wr_data // 写入 FIFO 的数据
);

//reg define
reg empty_d0;
reg empty_d1;

//*****************************************************
//** main code
//*****************************************************

//因为 empty 信号是属于 FIFO 读时钟域的
//所以对 empty 打两拍同步到写时钟域下
always @(posedge wr_clk or negedge rst_n) begin
    if(!rst_n) begin
        empty_d0 <= 1'b0;
        empty_d1 <= 1'b0;
    end
    else begin
        empty_d0 <= empty; //从一个外时钟域接入，第一级稳定
        empty_d1 <= empty_d0; //第二排则是同时钟域，能保证稳定，但不能保证正确
    end
end

//对 fifo_wr_en 赋值，当 FIFO 为空时开始写入，写满后停止写
always @(posedge wr_clk or negedge rst_n) begin
    if(!rst_n)
        fifo_wr_en <= 1'b0;
    else if(!wr_rst_busy) begin
        if(empty_d1)
            fifo_wr_en <= 1'b1;
        else if(almost_full)
            fifo_wr_en <= 1'b0;
    end
    else
        fifo_wr_en <= 1'b0;
end

//对 fifo_wr_data 赋值,0~254
always @(posedge wr_clk or negedge rst_n) begin
    if(!rst_n)
        fifo_wr_data <= 8'b0;
    else if(fifo_wr_en && fifo_wr_data < 8'd254)
        fifo_wr_data <= fifo_wr_data + 8'b1;
    else
        fifo_wr_data <= 8'b0;
end

endmodule